from django.http import HttpResponse
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from .serializers import RegisterSmscodeSerializer
from random import randint
from libs.yuntongxun.sms import CCP
# Create your views here.


# 生成验证码　这段代码不懂
class RegisterImageCodeView(APIView):
    """
    前段需要传递给我们一个uuid
    生成图片资源,记录图片验证码的内容
    团偏验证码的内容保存到redis中(key uuid)

    通过get方式来得到图片资源
    """

    def get(self,request,image_code_id):
        # 1.生成图片资源
        text,image = captcha.generate_captcha()

        # 2.1连接redis数据库
        redis_conn = get_redis_connection('code')

        # 2.2保存到redis中
        redis_conn.setex('img_%s'%image_code_id,60,text)
        # 3.返回响应

        # 图片是二进制
        # content_type 是MIME类型　语法形式为: 大类/小类
        return HttpResponse(image,content_type='image/jpeg')


# 这段代码不懂
class RegisterSmscodeView(APIView):
    """
    1.当用户点击获取短信验证码的时候,需要将　手机号, 图片验证码以及image_code_id(uuid)传递给后端
    2.接收参数
    3.校验参数
    4.生成短信验证码
    5.生成短信验证码到redis中
    6.发送短信
    7.反回相应
    GET   　　　　verifications/smscodes/mobile/text/image_code_id/
    GET          verifications/smscodes/?mobile=xxx&text=xxx&image_code_id=xxx
    GET          verifications/smscodes/(mobile)/?text=xxx&image_code_id=xxx
    以上三种形式都可以
    我们选择第三种
    """

    def get(self,request,mobile):
        # 1.接收参数
        query_params = request.query_params

        # 2.1创建序列化器
        serializer = RegisterSmscodeSerializer(data=query_params)

        # 2.2进行校验
        serializer.is_valid(raise_exception=True)

        #　3.生成短信验证码
        sms_code = randint(100000,999999)
        print(sms_code)

        #　4.保存短信验证码到redis中

        redis_conn = get_redis_connection("code")

        from . import constants
        redis_conn.setex('sms_%s'%mobile,constants.SMS_CODE_EXPIRE,sms_code)

        # # 5.发送短信
        # ccp = CCP()
        # # 注意： 测试的短信模板编号为1
        # ccp.send_template_sms(mobile, [sms_code, 5], 1)

        # 调用异步发送短信的方法！
        from celery_tasks.sms.tasks import send_sms_code

        # 千万不能直接调用

        # 需要使用delay
        # delay() 的参数和方法的参数一致

        send_sms_code.delay(mobile,sms_code)

        # 6.返回响应
        return Response({"msg":"ok"})



